/*
 * URL: http://code.google.com/p/nagatsuki-accounting-lib/
 */
/**
 * $Id: JournalService.java 108 2009-07-27 05:08:33Z tanaka.akira.2006 $
 */
package com.googlecode.nagatsuki.accountinglib.service;

import com.googlecode.nagatsuki.accountinglib.exception.IllegalDateNoException;
import com.googlecode.nagatsuki.accountinglib.exception.UnbalancedException;
import com.googlecode.nagatsuki.accountinglib.model.journal.Entry;
import com.googlecode.nagatsuki.accountinglib.model.journal.Journal;
import com.googlecode.nagatsuki.accountinglib.model.journal.Transaction;

/**
 * 仕訳サービス
 * <p>
 * <code>#addEntry</code>で {@link Transaction} を作成して、 <code>#entry</code>で
 * {@link Transaction} を{@link Journal} へ記帳します。
 * </p>
 *
 * @author tanaka.akira.2006
 * @see {@link Service}
 *
 */
public interface JournalService extends Service {

	/**
	 * 取引を仕訳帳に記帳します。
	 *
	 * @param journal
	 *            仕訳帳
	 * @param transaction
	 *            取引
	 * @throws UnbalancedException
	 * @throws IllegalDateNoException
	 */
	void entry(Journal journal, final Transaction transaction)
			throws UnbalancedException, IllegalDateNoException;

	/**
	 * 仕訳最小単位を取引 {@link Transaction} に追加します。
	 *
	 * @param transaction
	 *            取引
	 * @param entry
	 *            仕訳最小単位
	 */
	void createTransaction(Transaction transaction, final Entry entry);

	/**
	 * 指定した取引を仕訳帳に更新します。
	 *
	 * @param journal
	 *            仕訳帳
	 * @param dateNo
	 *            取引番号
	 * @param transaction
	 *            取引
	 * @throws IllegalDateNoException
	 */
	void update(Journal journal, final String dateNo, Transaction transaction)
			throws IllegalDateNoException;

	/**
	 * 指定した取引を仕訳帳から削除します。
	 *
	 * @param journal
	 *            仕訳帳
	 * @param dateNo
	 *            取引番号
	 * @throws IllegalDateNoException
	 */
	void delete(Journal journal, final String dateNo)
			throws IllegalDateNoException;
}
